Name: Zizhao He

Part 1: Exploring Evictions and Code Violations in Philadelphia

1.1 Explore Eviction Lab Data

In [150]:
import geopandas as gpd
import pandas as pd
import numpy as np

1.1.1 Read data using geopandas

In [151]:
PATracts = gpd.read_file("https://eviction-lab-data-downloads.s3.amazonaws.com/PA/tracts.geojson")
In [152]:
PATracts.head()
Out[152]:
GEOID west south east north n pl p-00 pr-00 roh-00 ... pm-16 po-16 ef-16 e-16 er-16 efr-16 lf-16 imputed-16 subbed-16 geometry
0 42003412002 -80.1243 40.5422 -80.0640 40.5890 4120.02 Allegheny County, Pennsylvania 4748.59 0.88 58.0 ... 0.00 0.0 0.0 0.0 0.00 0.00 1.0 0.0 1.0 (POLYGON ((-80.06670099999999 40.584012, -80.0...
1 42003413100 -80.0681 40.5850 -79.9906 40.6143 4131 Allegheny County, Pennsylvania 6771.01 3.47 729.0 ... 1.59 0.0 12.0 2.0 0.27 1.62 1.0 0.0 1.0 (POLYGON ((-80.068057 40.612536, -80.054520999...
2 42003413300 -80.0657 40.5527 -80.0210 40.5721 4133 Allegheny County, Pennsylvania 5044.59 2.99 119.0 ... 0.95 0.0 4.0 1.0 0.49 1.96 1.0 0.0 1.0 (POLYGON ((-80.03821600000001 40.553495, -80.0...
3 42003416000 -79.8113 40.5440 -79.7637 40.5630 4160 Allegheny County, Pennsylvania 1775.93 4.99 121.0 ... 0.55 0.0 1.0 1.0 0.65 0.65 1.0 0.0 1.0 (POLYGON ((-79.765946 40.550915, -79.765415 40...
4 42003417200 -79.7948 40.5341 -79.7642 40.5443 4172 Allegheny County, Pennsylvania 1428.03 11.95 321.0 ... 0.00 0.0 7.0 3.0 0.82 1.90 1.0 0.0 1.0 (POLYGON ((-79.771137 40.544153, -79.764172 40...

5 rows × 399 columns

1.1.2 Explore and trim the data

In [153]:
valid_county = ['Philadelphia County, Pennsylvania']
In [154]:
selection = PATracts['pl'].isin(valid_county)
PhillyTracts = PATracts.loc[selection]
In [155]:
PhillyTracts
Out[155]:
GEOID west south east north n pl p-00 pr-00 roh-00 ... pm-16 po-16 ef-16 e-16 er-16 efr-16 lf-16 imputed-16 subbed-16 geometry
435 42101000100 -75.1523 39.9481 -75.1415 39.9569 1 Philadelphia County, Pennsylvania 2646.71 9.26 1347.0 ... 2.49 0.00 25.0 16.0 0.93 1.45 0.0 0.0 1.0 (POLYGON ((-75.14160699999999 39.955491, -75.1...
436 42101000200 -75.1631 39.9529 -75.1511 39.9578 2 Philadelphia County, Pennsylvania 1362.00 56.42 374.0 ... 2.27 0.00 11.0 8.0 0.95 1.30 0.0 0.0 1.0 (POLYGON ((-75.151223 39.956862, -75.151669 39...
437 42101000300 -75.1798 39.9544 -75.1623 39.9599 3 Philadelphia County, Pennsylvania 2570.00 12.16 861.0 ... 1.76 0.00 26.0 14.0 0.73 1.35 0.0 0.0 1.0 (POLYGON ((-75.162339 39.957825, -75.162374 39...
438 42101000801 -75.1833 39.9486 -75.1773 39.9515 8.01 Philadelphia County, Pennsylvania 1478.00 14.40 810.0 ... 1.42 3.78 13.0 4.0 0.51 1.64 0.0 0.0 1.0 (POLYGON ((-75.177323 39.950964, -75.177843 39...
439 42101000804 -75.1712 39.9470 -75.1643 39.9501 8.04 Philadelphia County, Pennsylvania 3301.00 14.40 2058.0 ... 0.19 0.35 22.0 7.0 0.33 1.04 0.0 0.0 1.0 (POLYGON ((-75.17118000000001 39.947784, -75.1...
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
3200 42101017800 -75.1255 39.9869 -75.1095 39.9965 178 Philadelphia County, Pennsylvania 6340.00 54.31 899.0 ... 1.82 0.37 178.0 104.0 7.93 13.57 0.0 0.0 1.0 (POLYGON ((-75.113387 39.996493, -75.111369 39...
3201 42101017900 -75.1224 39.9815 -75.1059 39.9921 179 Philadelphia County, Pennsylvania 6050.00 32.21 568.0 ... 1.66 0.00 121.0 80.0 7.77 11.75 0.0 0.0 1.0 (POLYGON ((-75.105915 39.988037, -75.108358999...
3202 42101018002 -75.1112 39.9790 -75.1014 39.9880 180.02 Philadelphia County, Pennsylvania 5471.00 16.33 519.0 ... 0.00 0.00 41.0 32.0 4.24 5.43 0.0 0.0 1.0 (POLYGON ((-75.105064 39.987073, -75.104365 39...
3203 42101018300 -75.0865 39.9838 -75.0654 40.0056 183 Philadelphia County, Pennsylvania 4008.00 10.01 184.0 ... 0.24 0.00 12.0 7.0 2.40 4.11 0.0 0.0 1.0 (POLYGON ((-75.06581466910771 39.9862895182783...
3204 42101018400 -75.0757 39.9863 -75.0522 40.0088 184 Philadelphia County, Pennsylvania 2178.00 14.07 163.0 ... 0.32 0.00 7.0 2.0 0.84 2.94 0.0 0.0 1.0 (POLYGON ((-75.059017 39.992512, -75.059542562...

384 rows × 399 columns

1.1.3 Transform from wide to tidy format

In [156]:
Eviction = pd.melt(PhillyTracts, id_vars=['GEOID','geometry'], value_name = 'Evictions', value_vars = ['e-{:02d}'.format(x) for x in range(3, 17)], var_name = 'Original')
In [157]:
Eviction
Out[157]:
GEOID geometry Original Evictions
0 42101000100 (POLYGON ((-75.14160699999999 39.955491, -75.1... e-03 21.0
1 42101000200 (POLYGON ((-75.151223 39.956862, -75.151669 39... e-03 3.0
2 42101000300 (POLYGON ((-75.162339 39.957825, -75.162374 39... e-03 17.0
3 42101000801 (POLYGON ((-75.177323 39.950964, -75.177843 39... e-03 13.0
4 42101000804 (POLYGON ((-75.17118000000001 39.947784, -75.1... e-03 21.0
... ... ... ... ...
5371 42101017800 (POLYGON ((-75.113387 39.996493, -75.111369 39... e-16 104.0
5372 42101017900 (POLYGON ((-75.105915 39.988037, -75.108358999... e-16 80.0
5373 42101018002 (POLYGON ((-75.105064 39.987073, -75.104365 39... e-16 32.0
5374 42101018300 (POLYGON ((-75.06581466910771 39.9862895182783... e-16 7.0
5375 42101018400 (POLYGON ((-75.059017 39.992512, -75.059542562... e-16 2.0

5376 rows × 4 columns

In [158]:
annual_Eviction = Eviction.groupby(['Original'])['Evictions'].sum()
In [159]:
annual_Eviction
Out[159]:
Original
e-03    10647.0
e-04    10491.0
e-05    10550.0
e-06    11078.0
e-07    11032.0
e-08    10866.0
e-09     9821.0
e-10    10628.0
e-11    10882.0
e-12    11130.0
e-13    10803.0
e-14    11182.0
e-15    10098.0
e-16    10264.0
Name: Evictions, dtype: float64
In [16]:
#annual_Eviction.plot()
Out[16]:
<matplotlib.axes._subplots.AxesSubplot at 0x267cb53da58>

1.1.4 Plot the total number of evictions per year from 2003 to 2016

In [160]:
import hvplot.pandas

Line Chart

In [161]:
Line = annual_Eviction.hvplot(kind='line')
Line
Out[161]:

Bar Chart

In [162]:
Bar = annual_Eviction.hvplot(kind='bar', rot=90, width=1000)
Bar
Out[162]:

1.1.5 The number of evictions across Philadelphia

In [163]:
choropleth = Eviction.hvplot(c='Evictions', groupby='Original', dynamic=False, geo=True, height=500, width=500)

choropleth
Out[163]:

1.2 Code Violations in Philadelphia

1.2.1 Load data from 2012 to 2016

In [164]:
LI_Violation = pd.read_csv("C:/Users/alber/OneDrive/Desktop/MUSA620/HW3/assignment-3-zizhaohe-master/data/li_violations.csv",sep=',',engine='python')
In [165]:
LI_Violation.head()
Out[165]:
lat lng violationdescription
0 40.050526 -75.126076 CLIP VIOLATION NOTICE
1 40.050593 -75.126578 LICENSE-CHANGE OF ADDRESS
2 40.050593 -75.126578 LICENSE-RES SFD/2FD
3 39.991994 -75.128895 EXT A-CLEAN WEEDS/PLANTS
4 40.023260 -75.164848 EXT A-VACANT LOT CLEAN/MAINTAI

1.2.2 Trim to specific violation types

In [166]:
Valid_Violation = ['INT-PLMBG MAINT FIXTURES-RES',
 'INT S-CEILING REPAIR/MAINT SAN',
 'PLUMBING SYSTEMS-GENERAL',
 'CO DETECTOR NEEDED',
 'INTERIOR SURFACES',
 'EXT S-ROOF REPAIR',
 'ELEC-RECEPTABLE DEFECTIVE-RES',
 'INT S-FLOOR REPAIR',
 'DRAINAGE-MAIN DRAIN REPAIR-RES',
 'DRAINAGE-DOWNSPOUT REPR/REPLC',
 'LIGHT FIXTURE DEFECTIVE-RES',
 'LICENSE-RES SFD/2FD',
 'ELECTRICAL -HAZARD',
 'VACANT PROPERTIES-GENERAL',
 'INT-PLMBG FIXTURES-RES']
In [167]:
selection = LI_Violation['violationdescription'].isin(Valid_Violation)
Violation_trimmed = LI_Violation.loc[selection]
In [168]:
Violation_trimmed
Out[168]:
lat lng violationdescription
2 40.050593 -75.126578 LICENSE-RES SFD/2FD
25 40.022406 -75.121872 EXT S-ROOF REPAIR
30 40.023237 -75.121726 CO DETECTOR NEEDED
31 40.023397 -75.122241 INT S-CEILING REPAIR/MAINT SAN
34 40.023773 -75.121603 INT S-FLOOR REPAIR
... ... ... ...
433982 39.962287 -75.226644 CO DETECTOR NEEDED
433985 39.968669 -75.212576 CO DETECTOR NEEDED
434013 39.950209 -75.227244 INT S-CEILING REPAIR/MAINT SAN
434043 39.936179 -75.192078 INT S-FLOOR REPAIR
434046 40.012805 -75.155963 ELECTRICAL -HAZARD

34108 rows × 3 columns

In [169]:
Violation = Violation_trimmed.dropna(subset=['lat', 'lng'])
Violation['Coordinates'] = list(zip(Violation['lng'], Violation['lat']))
In [170]:
Violation['Coordinates'].head()
Out[170]:
2      (-75.12657800000001, 40.050593)
25             (-75.121872, 40.022406)
30             (-75.121726, 40.023237)
31    (-75.122241, 40.023396999999996)
34     (-75.12160300000001, 40.023773)
Name: Coordinates, dtype: object
In [171]:
from shapely.geometry import Point
Violation['Coordinates'] = Violation['Coordinates'].apply(Point)
Violation['Coordinates'].head()
Out[171]:
2     POINT (-75.12657800000001 40.050593)
25            POINT (-75.121872 40.022406)
30            POINT (-75.121726 40.023237)
31            POINT (-75.122241 40.023397)
34    POINT (-75.12160300000001 40.023773)
Name: Coordinates, dtype: object
In [172]:
# Convert to a GeoDataFrame
Violation = gpd.GeoDataFrame(Violation, geometry="Coordinates", crs={"init": "epsg:32618"})
Violation
Out[172]:
lat lng violationdescription Coordinates
2 40.050593 -75.126578 LICENSE-RES SFD/2FD POINT (-75.12657800000001 40.050593)
25 40.022406 -75.121872 EXT S-ROOF REPAIR POINT (-75.121872 40.022406)
30 40.023237 -75.121726 CO DETECTOR NEEDED POINT (-75.121726 40.023237)
31 40.023397 -75.122241 INT S-CEILING REPAIR/MAINT SAN POINT (-75.122241 40.023397)
34 40.023773 -75.121603 INT S-FLOOR REPAIR POINT (-75.12160300000001 40.023773)
... ... ... ... ...
433982 39.962287 -75.226644 CO DETECTOR NEEDED POINT (-75.22664399999999 39.962287)
433985 39.968669 -75.212576 CO DETECTOR NEEDED POINT (-75.212576 39.968669)
434013 39.950209 -75.227244 INT S-CEILING REPAIR/MAINT SAN POINT (-75.227244 39.950209)
434043 39.936179 -75.192078 INT S-FLOOR REPAIR POINT (-75.19207800000001 39.936179)
434046 40.012805 -75.155963 ELECTRICAL -HAZARD POINT (-75.155963 40.012805)

34108 rows × 4 columns

In [173]:
Eviction_Geo = gpd.GeoDataFrame(Eviction, geometry="geometry", crs={"init": "epsg:32618"})
Eviction_Geo
Out[173]:
GEOID geometry Original Evictions
0 42101000100 (POLYGON ((-75.14160699999999 39.955491, -75.1... e-03 21.0
1 42101000200 (POLYGON ((-75.151223 39.956862, -75.151669 39... e-03 3.0
2 42101000300 (POLYGON ((-75.162339 39.957825, -75.162374 39... e-03 17.0
3 42101000801 (POLYGON ((-75.177323 39.950964, -75.177843 39... e-03 13.0
4 42101000804 (POLYGON ((-75.17118000000001 39.947784, -75.1... e-03 21.0
... ... ... ... ...
5371 42101017800 (POLYGON ((-75.113387 39.996493, -75.111369 39... e-16 104.0
5372 42101017900 (POLYGON ((-75.105915 39.988037, -75.108358999... e-16 80.0
5373 42101018002 (POLYGON ((-75.105064 39.987073, -75.104365 39... e-16 32.0
5374 42101018300 (POLYGON ((-75.06581466910771 39.9862895182783... e-16 7.0
5375 42101018400 (POLYGON ((-75.059017 39.992512, -75.059542562... e-16 2.0

5376 rows × 4 columns

1.2.3 Make a hex bin map

In [174]:
import cartopy.crs as ccrs
from matplotlib import pyplot as plt

%matplotlib inline
In [175]:
# Plot for the geometry boundary
ax = Eviction_Geo.plot(facecolor='none', edgecolor='black')
ax.set_axis_off()
ax.set_aspect("equal")
In [176]:
# create the axes
fig, ax = plt.subplots(figsize=(12, 12))

# use the .x and .y attributes
vals = ax.hexbin(Violation.geometry.x, Violation.geometry.y, gridsize=50)

# add the eviction geometry boundaries
Eviction_Geo.plot(ax=ax, facecolor="none", edgecolor="white", linewidth=0.1)

# add a colorbar and format
plt.colorbar(vals)
ax.set_axis_off()
ax.set_aspect("equal")

1.2.4 Spatially join data sets

In [177]:
# Remove unwanted columns
unwanted = ['Original', 'Evictions']
eviction_df = Eviction_Geo.drop(unwanted, axis=1)
eviction_df
Out[177]:
GEOID geometry
0 42101000100 (POLYGON ((-75.14160699999999 39.955491, -75.1...
1 42101000200 (POLYGON ((-75.151223 39.956862, -75.151669 39...
2 42101000300 (POLYGON ((-75.162339 39.957825, -75.162374 39...
3 42101000801 (POLYGON ((-75.177323 39.950964, -75.177843 39...
4 42101000804 (POLYGON ((-75.17118000000001 39.947784, -75.1...
... ... ...
5371 42101017800 (POLYGON ((-75.113387 39.996493, -75.111369 39...
5372 42101017900 (POLYGON ((-75.105915 39.988037, -75.108358999...
5373 42101018002 (POLYGON ((-75.105064 39.987073, -75.104365 39...
5374 42101018300 (POLYGON ((-75.06581466910771 39.9862895182783...
5375 42101018400 (POLYGON ((-75.059017 39.992512, -75.059542562...

5376 rows × 2 columns

In [178]:
# Change CRS
eviction_df = eviction_df.to_crs(epsg=32618)
Violation = Violation.to_crs(epsg=32618)
Violation
Out[178]:
lat lng violationdescription Coordinates
2 40.050593 -75.126578 LICENSE-RES SFD/2FD POINT (-75.12657799985027 40.05059299999999)
25 40.022406 -75.121872 EXT S-ROOF REPAIR POINT (-75.12187199940672 40.022406)
30 40.023237 -75.121726 CO DETECTOR NEEDED POINT (-75.12172599928454 40.02323699999999)
31 40.023397 -75.122241 INT S-CEILING REPAIR/MAINT SAN POINT (-75.12224100041203 40.02339699999999)
34 40.023773 -75.121603 INT S-FLOOR REPAIR POINT (-75.12160299980314 40.023773)
... ... ... ... ...
433982 39.962287 -75.226644 CO DETECTOR NEEDED POINT (-75.22664400015492 39.962287)
433985 39.968669 -75.212576 CO DETECTOR NEEDED POINT (-75.21257599943783 39.968669)
434013 39.950209 -75.227244 INT S-CEILING REPAIR/MAINT SAN POINT (-75.22724400059087 39.95020899999999)
434043 39.936179 -75.192078 INT S-FLOOR REPAIR POINT (-75.19207799970172 39.936179)
434046 40.012805 -75.155963 ELECTRICAL -HAZARD POINT (-75.1559630005504 40.01280499999999)

34108 rows × 4 columns

In [179]:
# Spatial Join
joined = gpd.sjoin(Violation, eviction_df, op='within', how='left')
joined.head()
Out[179]:
lat lng violationdescription Coordinates index_right GEOID
2 40.050593 -75.126578 LICENSE-RES SFD/2FD POINT (-75.12657799985027 40.05059299999999) 364 42101027100
2 40.050593 -75.126578 LICENSE-RES SFD/2FD POINT (-75.12657799985027 40.05059299999999) 748 42101027100
2 40.050593 -75.126578 LICENSE-RES SFD/2FD POINT (-75.12657799985027 40.05059299999999) 1132 42101027100
2 40.050593 -75.126578 LICENSE-RES SFD/2FD POINT (-75.12657799985027 40.05059299999999) 1516 42101027100
2 40.050593 -75.126578 LICENSE-RES SFD/2FD POINT (-75.12657799985027 40.05059299999999) 1900 42101027100

1.2.5 Calculate the number of violations by type per census tract

In [180]:
joined['N'] = 1
joined.head()
Out[180]:
lat lng violationdescription Coordinates index_right GEOID N
2 40.050593 -75.126578 LICENSE-RES SFD/2FD POINT (-75.12657799985027 40.05059299999999) 364 42101027100 1
2 40.050593 -75.126578 LICENSE-RES SFD/2FD POINT (-75.12657799985027 40.05059299999999) 748 42101027100 1
2 40.050593 -75.126578 LICENSE-RES SFD/2FD POINT (-75.12657799985027 40.05059299999999) 1132 42101027100 1
2 40.050593 -75.126578 LICENSE-RES SFD/2FD POINT (-75.12657799985027 40.05059299999999) 1516 42101027100 1
2 40.050593 -75.126578 LICENSE-RES SFD/2FD POINT (-75.12657799985027 40.05059299999999) 1900 42101027100 1
In [181]:
ViolationPerCT = joined.groupby(['violationdescription','GEOID']).N.sum().unstack(fill_value=0).stack().reset_index(name='N')
ViolationPerCT
Out[181]:
violationdescription GEOID N
0 CO DETECTOR NEEDED 42101000100 0
1 CO DETECTOR NEEDED 42101000200 0
2 CO DETECTOR NEEDED 42101000300 0
3 CO DETECTOR NEEDED 42101000401 14
4 CO DETECTOR NEEDED 42101000402 14
... ... ... ...
5530 VACANT PROPERTIES-GENERAL 42101980100 0
5531 VACANT PROPERTIES-GENERAL 42101980500 0
5532 VACANT PROPERTIES-GENERAL 42101980700 0
5533 VACANT PROPERTIES-GENERAL 42101980800 0
5534 VACANT PROPERTIES-GENERAL 42101989100 0

5535 rows × 3 columns

1.2.6 Merge with census tracts geometries

In [182]:
# Remove the duplicates
eviction_df2 = eviction_df.drop_duplicates(subset = 'GEOID', keep = 'first', inplace = False)
In [183]:
Merged = eviction_df2.merge(ViolationPerCT, on='GEOID')
Merged = Merged.rename(columns={'violationdescription': 'Violation Type', 'N': 'Occurances Number'})
Merged
Out[183]:
GEOID geometry Violation Type Occurances Number
0 42101000100 (POLYGON ((-75.14160700002685 39.9554909999999... CO DETECTOR NEEDED 0
1 42101000100 (POLYGON ((-75.14160700002685 39.9554909999999... DRAINAGE-DOWNSPOUT REPR/REPLC 84
2 42101000100 (POLYGON ((-75.14160700002685 39.9554909999999... DRAINAGE-MAIN DRAIN REPAIR-RES 0
3 42101000100 (POLYGON ((-75.14160700002685 39.9554909999999... ELEC-RECEPTABLE DEFECTIVE-RES 0
4 42101000100 (POLYGON ((-75.14160700002685 39.9554909999999... ELECTRICAL -HAZARD 14
... ... ... ... ...
5530 42101018400 (POLYGON ((-75.05901699943934 39.9925119999999... INTERIOR SURFACES 28
5531 42101018400 (POLYGON ((-75.05901699943934 39.9925119999999... LICENSE-RES SFD/2FD 154
5532 42101018400 (POLYGON ((-75.05901699943934 39.9925119999999... LIGHT FIXTURE DEFECTIVE-RES 0
5533 42101018400 (POLYGON ((-75.05901699943934 39.9925119999999... PLUMBING SYSTEMS-GENERAL 28
5534 42101018400 (POLYGON ((-75.05901699943934 39.9925119999999... VACANT PROPERTIES-GENERAL 0

5535 rows × 4 columns

1.2.7 Interactive choropleths for each violation type

In [184]:
choropleth_vio = Merged.hvplot(c='Occurances Number', groupby='Violation Type', dynamic=False, geo=True, height=600, width=600)

choropleth_vio
Out[184]:

1.3. A side-by-side comparison

  • Trim the data frame plotted in section 1.1.5 to only include evictions from 2016
In [185]:
valid_year = ['e-16']
selection = Eviction['Original'].isin(valid_year)
Eviction_2016 = Eviction.loc[selection]
In [186]:
Eviction_2016
Out[186]:
GEOID geometry Original Evictions
4992 42101000100 (POLYGON ((-75.14160699999999 39.955491, -75.1... e-16 16.0
4993 42101000200 (POLYGON ((-75.151223 39.956862, -75.151669 39... e-16 8.0
4994 42101000300 (POLYGON ((-75.162339 39.957825, -75.162374 39... e-16 14.0
4995 42101000801 (POLYGON ((-75.177323 39.950964, -75.177843 39... e-16 4.0
4996 42101000804 (POLYGON ((-75.17118000000001 39.947784, -75.1... e-16 7.0
... ... ... ... ...
5371 42101017800 (POLYGON ((-75.113387 39.996493, -75.111369 39... e-16 104.0
5372 42101017900 (POLYGON ((-75.105915 39.988037, -75.108358999... e-16 80.0
5373 42101018002 (POLYGON ((-75.105064 39.987073, -75.104365 39... e-16 32.0
5374 42101018300 (POLYGON ((-75.06581466910771 39.9862895182783... e-16 7.0
5375 42101018400 (POLYGON ((-75.059017 39.992512, -75.059542562... e-16 2.0

384 rows × 4 columns

  • Trim the data frame plotted in section 1.2.7 to only include a single violation type
In [187]:
valid_type = ['DRAINAGE-DOWNSPOUT REPR/REPLC']
selection = Merged['Violation Type'].isin(valid_type)
Vio_DDRR = Merged.loc[selection]
In [189]:
Vio_DDRR
Out[189]:
GEOID geometry Violation Type Occurances Number
1 42101000100 (POLYGON ((-75.14160700002685 39.9554909999999... DRAINAGE-DOWNSPOUT REPR/REPLC 84
16 42101000200 (POLYGON ((-75.15122299961513 39.956862, -75.1... DRAINAGE-DOWNSPOUT REPR/REPLC 14
31 42101000300 (POLYGON ((-75.16233899921644 39.9578249999999... DRAINAGE-DOWNSPOUT REPR/REPLC 28
46 42101000801 (POLYGON ((-75.17732299974887 39.9509639999999... DRAINAGE-DOWNSPOUT REPR/REPLC 0
61 42101000804 (POLYGON ((-75.17118000064511 39.9477840000000... DRAINAGE-DOWNSPOUT REPR/REPLC 0
... ... ... ... ...
5461 42101017800 (POLYGON ((-75.11338699987391 39.9964929999999... DRAINAGE-DOWNSPOUT REPR/REPLC 196
5476 42101017900 (POLYGON ((-75.105915000604 39.98803699999999,... DRAINAGE-DOWNSPOUT REPR/REPLC 294
5491 42101018002 (POLYGON ((-75.10506400006125 39.987073, -75.1... DRAINAGE-DOWNSPOUT REPR/REPLC 56
5506 42101018300 (POLYGON ((-75.06581466918578 39.9862895182783... DRAINAGE-DOWNSPOUT REPR/REPLC 42
5521 42101018400 (POLYGON ((-75.05901699943934 39.9925119999999... DRAINAGE-DOWNSPOUT REPR/REPLC 70

369 rows × 4 columns

  • Choropleth for evictions in 2016
In [190]:
choropleth_Evi16 = Eviction_2016.hvplot(c='Evictions', dynamic=False, geo=True, height=500, width=500)

choropleth_Evi16
Out[190]:
  • Choropleth for occurances of DRAINAGE-DOWNSPOUT REPR/REPLC
In [191]:
choropleth_DDRR = Vio_DDRR.hvplot(c='Occurances Number', dynamic=False, geo=True, height=500, width=500)

choropleth_DDRR
Out[191]:
  • Side by side comparison of the two choropleths
In [192]:
combined = choropleth_Evi16 + choropleth_DDRR
combined
Out[192]:

Part 2: Exploring the NDVI in Philadelphia

In [193]:
import rasterio as rio

2.1.1 Load Landsat data for Philadelphia

In [194]:
# Open the file and get a file "handle"
landsat = rio.open("C:/Users/alber/OneDrive/Desktop/MUSA620/HW3/assignment-3-zizhaohe-master/data/landsat8_philly.tif")
landsat
Out[194]:
<open DatasetReader name='C:/Users/alber/OneDrive/Desktop/MUSA620/HW3/assignment-3-zizhaohe-master/data/landsat8_philly.tif' mode='r'>
In [195]:
print(landsat.crs.data)
landsat.meta
{'init': 'epsg:32618'}
Out[195]:
{'driver': 'GTiff',
 'dtype': 'uint16',
 'nodata': None,
 'width': 923,
 'height': 999,
 'count': 10,
 'crs': CRS.from_dict(init='epsg:32618'),
 'transform': Affine(30.0, 0.0, 476064.3596176505,
        0.0, -30.0, 4443066.927074196)}
In [196]:
# This is just a numpy array
data = landsat.read(1)
data
Out[196]:
array([[10901, 10618, 10751, ..., 12145, 11540, 14954],
       [11602, 10718, 10546, ..., 11872, 11982, 12888],
       [10975, 10384, 10357, ..., 11544, 12318, 12456],
       ...,
       [12281, 12117, 12072, ..., 11412, 11724, 11088],
       [12747, 11866, 11587, ..., 11558, 12028, 10605],
       [11791, 11677, 10656, ..., 10615, 11557, 11137]], dtype=uint16)
In [197]:
import matplotlib.colors as mcolors
In [198]:
# Add the extent of landsat in the map
# Initialize
fig, ax = plt.subplots(figsize=(10, 10))

img = ax.imshow(
    data,
    norm=mcolors.LogNorm(),
    extent=[
        landsat.bounds.left,
        landsat.bounds.right,
        landsat.bounds.bottom,
        landsat.bounds.top,
    ],
)

# Add a colorbar
plt.colorbar(img)
Out[198]:
<matplotlib.colorbar.Colorbar at 0x267d16d97f0>

2.1.2 Separating the city from the suburbs

In [199]:
CityLimits = gpd.read_file("C:/Users/alber/OneDrive/Desktop/MUSA620/HW3/assignment-3-zizhaohe-master/data/City_Limits.geojson")
In [200]:
# Convert the city limits polygon to a better CRS
CityLimits = CityLimits.to_crs(epsg=32618)
In [201]:
CityLimits
Out[201]:
OBJECTID Shape__Area Shape__Length geometry
0 1 0.038911 1.259687 POLYGON ((498724.959914474 4443066.927074197, ...
In [202]:
# City limits polygon
fig, ax = plt.subplots(figsize=(5, 5))
CityLimits.to_crs(epsg=32618).plot(ax=ax, facecolor="black", edgecolor="black")

ax.set_title("Philly City Limit")
ax.set_axis_off()
ax.set_aspect("equal")
In [203]:
# Add city limits boundary on the map
# Initialize
fig, ax = plt.subplots(figsize=(10, 10))

landsat_extent = [
    landsat.bounds.left,
    landsat.bounds.right,
    landsat.bounds.bottom,
    landsat.bounds.top,
]

img = ax.imshow(data, norm=mcolors.LogNorm(), extent=landsat_extent)

# Add the city limits
CityLimits.plot(ax=ax, facecolor="none", edgecolor="white")
# Add a colorbar
plt.colorbar(img)
ax.set_axis_off()
In [204]:
from geopandas import GeoSeries
from shapely.geometry import Polygon
  • Create an envelope polygon of the city polygon
In [205]:
Envelope = CityLimits['geometry'].envelope
In [206]:
Envelope = Envelope.to_crs(epsg=32618)
In [207]:
# Envelope Polygon
fig, ax = plt.subplots(figsize=(10, 10))
Envelope.to_crs(epsg=32618).plot(ax=ax, facecolor="grey", edgecolor="black")

ax.set_title("Envelope")
ax.set_axis_off()
ax.set_aspect("equal")
  • calculate the suburbs polygon from the city limits polygon and the envelope polygon
In [208]:
Suburb = Envelope.difference(CityLimits)
In [209]:
Suburb = Suburb.to_crs(epsg=32618)
In [210]:
fig, ax = plt.subplots(figsize=(10, 10))
Suburb.to_crs(epsg=32618).plot(ax=ax, facecolor="lightgrey", edgecolor="black")

ax.set_title("Suburb")
ax.set_axis_off()
ax.set_aspect("equal")
In [211]:
# Only show the suburb area on the map
# Initialize
fig, ax = plt.subplots(figsize=(10, 10))

landsat_extent = [
    landsat.bounds.left,
    landsat.bounds.right,
    landsat.bounds.bottom,
    landsat.bounds.top,
]

img = ax.imshow(data, norm=mcolors.LogNorm(), extent=landsat_extent)

# Add the city limits
CityLimits.plot(ax=ax, facecolor="white", edgecolor="white")
Suburb.plot(ax=ax, facecolor="none", edgecolor="white")

# Add a colorbar
plt.colorbar(img)
ax.set_axis_off()

2.1.3 Mask and calculate the NDVI for the city and the suburbs

In [212]:
from rasterio.mask import mask
  • Mask for City
In [213]:
masked_City, mask_transform = mask(
    dataset=landsat, 
    shapes=CityLimits.geometry, 
    crop=True, # remove pixels not within boundary
    all_touched=True, # get all pixels that touch the boudnary
    filled=False # do not fill cropped pixels with a default value
)
In [214]:
masked_City
Out[214]:
masked_array(
  data=[[[--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         ...,
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --]],

        [[--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         ...,
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --]],

        [[--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         ...,
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --]],

        ...,

        [[--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         ...,
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --]],

        [[--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         ...,
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --]],

        [[--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         ...,
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --],
         [--, --, --, ..., --, --, --]]],
  mask=[[[ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         ...,
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True]],

        [[ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         ...,
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True]],

        [[ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         ...,
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True]],

        ...,

        [[ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         ...,
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True]],

        [[ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         ...,
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True]],

        [[ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         ...,
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True],
         [ True,  True,  True, ...,  True,  True,  True]]],
  fill_value=999999,
  dtype=uint16)
In [215]:
# Initialize
fig, ax = plt.subplots(figsize=(10, 10))

# Plot the first band
plt.imshow(masked_City[0], cmap="viridis", extent=landsat_extent)

# Format and add the city limits
CityLimits.boundary.plot(ax=ax, color="gray", linewidth=4)
ax.set_axis_off()
In [216]:
landsat
Out[216]:
<open DatasetReader name='C:/Users/alber/OneDrive/Desktop/MUSA620/HW3/assignment-3-zizhaohe-master/data/landsat8_philly.tif' mode='r'>
  • calculate the NDVI for the city
In [217]:
# Note that the indexing here is zero-based, e.g., band 1 is index 0
red_1 = masked_City[3]
nir_1 = masked_City[4]
In [218]:
def calculate_NDVI_1(nir_1, red_1):
    """
    Calculate the NDVI from the NIR and red landsat bands
    """
    
    # Convert to floats
    nir_1 = nir_1.astype(float)
    red_1 = red_1.astype(float)
    
    # Get valid entries
    check = np.logical_and( red_1.mask == False, nir_1.mask == False )
    
    # Where the check is True, return the NDVI, else return NaN
    ndvi = np.where(check,  (nir_1 - red_1 ) / ( nir_1 + red_1 ), np.nan )
    return ndvi 
In [219]:
NDVI_City = calculate_NDVI_1(nir_1, red_1)
In [220]:
fig, ax = plt.subplots(figsize=(10,10))

# Plot NDVI
img = ax.imshow(NDVI_City, extent=landsat_extent)

# Format and plot city limits
CityLimits.plot(ax=ax, edgecolor='gray', facecolor='none', linewidth=4)
plt.colorbar(img)
ax.set_axis_off()
ax.set_title("NDVI in City", fontsize=18);
  • Mask for Suburb
In [222]:
masked_Suburb, mask_transform = mask(
    dataset=landsat, 
    shapes=Suburb.geometry, 
    crop=True, # remove pixels not within boundary
    all_touched=True, # get all pixels that touch the boudnary
    filled=False # do not fill cropped pixels with a default value
)
In [223]:
masked_Suburb
Out[223]:
masked_array(
  data=[[[10901, 10618, 10751, ..., 12145, 11540, 14954],
         [11602, 10718, 10546, ..., 11872, 11982, 12888],
         [10975, 10384, 10357, ..., 11544, 12318, 12456],
         ...,
         [12281, 12117, 12072, ..., 11412, 11724, 11088],
         [12747, 11866, 11587, ..., 11558, 12028, 10605],
         [11791, 11677, 10656, ..., 10615, 11557, 11137]],

        [[9909, 9598, 9764, ..., 11270, 10740, 15110],
         [10855, 9707, 9502, ..., 10959, 11065, 12241],
         [10060, 9337, 9274, ..., 10579, 11527, 11565],
         ...,
         [11569, 11467, 11226, ..., 10527, 10904, 10215],
         [12159, 11021, 10708, ..., 10821, 11300, 9679],
         [10899, 10845, 9558, ..., 9556, 10730, 10253]],

        [[9735, 8945, 9628, ..., 10618, 10730, 15725],
         [9940, 9378, 9034, ..., 9730, 10147, 11686],
         [9475, 8935, 8587, ..., 9654, 10485, 10829],
         ...,
         [11216, 11172, 11244, ..., 10131, 10544, 9737],
         [11712, 10706, 10037, ..., 10416, 11550, 9268],
         [10679, 10084, 8931, ..., 8920, 10234, 10101]],

        ...,

        [[5031, 5038, 5048, ..., 5043, 5039, 5058],
         [5042, 5053, 5045, ..., 5032, 5027, 5039],
         [5038, 5048, 5042, ..., 5027, 5027, 5023],
         ...,
         [5036, 5050, 5038, ..., 5046, 5041, 5045],
         [5030, 5028, 5046, ..., 5041, 5054, 5042],
         [5036, 5046, 5032, ..., 5037, 5042, 5051]],

        [[29485, 29382, 29287, ..., 32815, 32768, 32730],
         [29400, 29304, 29203, ..., 32903, 32859, 32800],
         [29360, 29315, 29264, ..., 32982, 32964, 32906],
         ...,
         [30791, 30459, 30130, ..., 30632, 30972, 31140],
         [30803, 30430, 30061, ..., 30842, 31132, 31243],
         [30853, 30425, 30021, ..., 31068, 31273, 31306]],

        [[26034, 25953, 25889, ..., 28011, 27960, 27866],
         [25940, 25896, 25866, ..., 28081, 28041, 27960],
         [25884, 25864, 25871, ..., 28083, 28068, 28030],
         ...,
         [26830, 26639, 26440, ..., 26907, 27145, 27132],
         [26854, 26665, 26470, ..., 27039, 27204, 27135],
         [26858, 26678, 26495, ..., 27193, 27239, 27124]]],
  mask=[[[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]],

        [[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]],

        [[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]],

        ...,

        [[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]],

        [[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]],

        [[False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         ...,
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False],
         [False, False, False, ..., False, False, False]]],
  fill_value=999999,
  dtype=uint16)
In [224]:
# Initialize
fig, ax = plt.subplots(figsize=(10, 10))

# Plot the first band
plt.imshow(masked_Suburb[0], cmap="viridis", extent=landsat_extent)

# Format and add the city limits
Suburb.boundary.plot(ax=ax, color="gray", linewidth=4)
ax.set_axis_off()
  • calculate the NDVI for the suburbs
In [225]:
# Note that the indexing here is zero-based, e.g., band 1 is index 0
red_2 = masked_Suburb[3]
nir_2 = masked_Suburb[4]
In [226]:
def calculate_NDVI_2(nir_2, red_2):
    """
    Calculate the NDVI from the NIR and red landsat bands
    """
    
    # Convert to floats
    nir_2 = nir_2.astype(float)
    red_2 = red_2.astype(float)
    
    # Get valid entries
    check = np.logical_and( red_2.mask == False, nir_2.mask == False )
    
    # Where the check is True, return the NDVI, else return NaN
    ndvi = np.where(check,  (nir_2 - red_2 ) / ( nir_2 + red_2 ), np.nan )
    return ndvi 
In [227]:
NDVI_Suburb = calculate_NDVI_2(nir_2, red_2)
In [228]:
fig, ax = plt.subplots(figsize=(10,10))

# Plot NDVI
img = ax.imshow(NDVI_Suburb, extent=landsat_extent)

# Format and plot city limits
Suburb.plot(ax=ax, edgecolor='gray', facecolor='none', linewidth=4)
plt.colorbar(img)
ax.set_axis_off()
ax.set_title("NDVI in Suburb", fontsize=18);

2.1.4 Calculate the median NDVI within the city and within the suburbs

In [229]:
from rasterstats import zonal_stats
In [230]:
print(np.nanmedian(NDVI_City))
0.20268593532493442
In [231]:
print(np.nanmedian(NDVI_Suburb))
0.3746654463028859

The suburb area has the higher median NDVI than the city area!

2.2 Calculating the NDVI for Philadelphia's street treets

2.2.1 Load the street tree data

In [232]:
StreetTree = gpd.read_file("C:/Users/alber/OneDrive/Desktop/MUSA620/HW3/assignment-3-zizhaohe-master/data/ppr_tree_canopy_points_2015.geojson")
In [233]:
StreetTree.head()
Out[233]:
objectid fcode geometry
0 1 3000 POINT (-75.005379 40.062537)
1 2 3000 POINT (-75.12959499999999 39.966915)
2 3 3000 POINT (-75.128377 39.983969)
3 4 3000 POINT (-75.128918 39.984889)
4 5 3000 POINT (-75.129479 39.971477)

2.2.2 Calculate the NDVI values at the locations of the street trees

In [234]:
StreetTree = StreetTree.to_crs(epsg=32618)
In [235]:
fig, ax = plt.subplots(figsize=(10,10))

# Plot NDVI
img = ax.imshow(NDVI_City, extent=landsat_extent)

# NEW: add the street trees
StreetTree.plot(ax=ax, edgecolor='crimson', facecolor='none', linewidth=2)

# Format and plot city limits
CityLimits.plot(ax=ax, edgecolor='white', facecolor='none', linewidth=4)
plt.colorbar(img)
ax.set_axis_off()
ax.set_title("NDVI vs. Street Trees in Philadelphia", fontsize=18);
In [236]:
NDVI_StreetTree = zonal_stats(StreetTree, NDVI_City, affine=landsat.transform, stats=['median'])
C:\Users\alber\Anaconda3\envs\musa-620\lib\site-packages\rasterstats\io.py:300: UserWarning: Setting nodata to -999; specify nodata explicitly
  warnings.warn("Setting nodata to -999; specify nodata explicitly")
In [237]:
NDVI_StreetTree
Out[237]:
[{'median': 0.23533681765389083},
 {'median': 0.26153510526124424},
 {'median': 0.09676935199429665},
 {'median': 0.07662965738028744},
 {'median': 0.2679520805273978},
 {'median': 0.07685867381111855},
 {'median': 0.1051902048359772},
 {'median': 0.09178423236514523},
 {'median': 0.07616818902392995},
 {'median': 0.10229947492304907},
 {'median': 0.10229947492304907},
 {'median': 0.10498730652690197},
 {'median': 0.06877747029138857},
 {'median': 0.06877747029138857},
 {'median': 0.05285700379635939},
 {'median': 0.10498730652690197},
 {'median': 0.12066604995374654},
 {'median': 0.10947590903753572},
 {'median': 0.07507408626934475},
 {'median': 0.03901195843952166},
 {'median': 0.07507408626934475},
 {'median': 0.16205979026451714},
 {'median': 0.16205979026451714},
 {'median': 0.11366006256517205},
 {'median': 0.03710847414985953},
 {'median': 0.06267842415783798},
 {'median': 0.1267991239048811},
 {'median': 0.037040112947429614},
 {'median': 0.053798362044620164},
 {'median': 0.05263157894736842},
 {'median': 0.12507723541354046},
 {'median': 0.06941665384023396},
 {'median': 0.10744947064485082},
 {'median': 0.2839460557916128},
 {'median': 0.10749630303719714},
 {'median': 0.13007691269734178},
 {'median': 0.10749630303719714},
 {'median': 0.13007691269734178},
 {'median': 0.13007691269734178},
 {'median': 0.4019429689684093},
 {'median': 0.20393270434490549},
 {'median': 0.045987723752289746},
 {'median': 0.07972935543861037},
 {'median': 0.22133607752336848},
 {'median': 0.034468103191805856},
 {'median': 0.12344999788395615},
 {'median': 0.026149878206046712},
 {'median': 0.2114827686070084},
 {'median': 0.03851732473811442},
 {'median': 0.14684971806815397},
 {'median': 0.06729195239569968},
 {'median': 0.06729195239569968},
 {'median': 0.06729195239569968},
 {'median': 0.07833603457590492},
 {'median': 0.19772680019405364},
 {'median': 0.09454972329364414},
 {'median': 0.06954609078184364},
 {'median': 0.2473409115830257},
 {'median': 0.3679541205918697},
 {'median': 0.09226353198469109},
 {'median': 0.1495218661225143},
 {'median': 0.1495218661225143},
 {'median': 0.08093268145919519},
 {'median': 0.09380473564709699},
 {'median': 0.2851618447436265},
 {'median': 0.10818385650224215},
 {'median': 0.25218747880349995},
 {'median': 0.1210164256633441},
 {'median': 0.19679750313803981},
 {'median': 0.36807504801300045},
 {'median': 0.36807504801300045},
 {'median': 0.1610583499433306},
 {'median': 0.14481185860889395},
 {'median': 0.11699262208689543},
 {'median': 0.31630740393626994},
 {'median': 0.41088723143715905},
 {'median': 0.09396525905959868},
 {'median': 0.17259344042309666},
 {'median': 0.14953703703703702},
 {'median': 0.10299509892902523},
 {'median': 0.10947590903753572},
 {'median': 0.10299509892902523},
 {'median': 0.1407424629931024},
 {'median': 0.10947590903753572},
 {'median': 0.13315567781311785},
 {'median': 0.05525488826815642},
 {'median': 0.08666144609762465},
 {'median': 0.12991339107261826},
 {'median': 0.49626240494909135},
 {'median': -0.03802672147995889},
 {'median': 0.26829739298358546},
 {'median': 0.29988737585747927},
 {'median': 0.04590387864409217},
 {'median': 0.25561325239523147},
 {'median': 0.1350542748647923},
 {'median': 0.17130106419498797},
 {'median': 0.07021300574777414},
 {'median': 0.25373257105252334},
 {'median': 0.25373257105252334},
 {'median': 0.1760417932207508},
 {'median': 0.19764812302125734},
 {'median': 0.09832011597168927},
 {'median': 0.1760417932207508},
 {'median': 0.127090552960675},
 {'median': 0.19764812302125734},
 {'median': 0.3658377437830784},
 {'median': 0.3658377437830784},
 {'median': 0.278427539014768},
 {'median': 0.3182551418201371},
 {'median': 0.3000227265348528},
 {'median': 0.3000227265348528},
 {'median': 0.3123873945064323},
 {'median': 0.4053930976157174},
 {'median': 0.2968057668143641},
 {'median': 0.35095808996823447},
 {'median': 0.3817834090365766},
 {'median': 0.2655713764147499},
 {'median': 0.2655713764147499},
 {'median': 0.19395069401284443},
 {'median': 0.19246768682216608},
 {'median': 0.37602000069446856},
 {'median': 0.3032574228884405},
 {'median': 0.27135769603097776},
 {'median': 0.2207834602829162},
 {'median': 0.2207834602829162},
 {'median': 0.1998970361109068},
 {'median': 0.3658377437830784},
 {'median': 0.3658377437830784},
 {'median': 0.2655713764147499},
 {'median': 0.2655713764147499},
 {'median': 0.19246768682216608},
 {'median': 0.35095808996823447},
 {'median': 0.35095808996823447},
 {'median': 0.37602000069446856},
 {'median': 0.15982514127305683},
 {'median': 0.26369975539410756},
 {'median': 0.26215073147056783},
 {'median': 0.26632956573468175},
 {'median': 0.26632956573468175},
 {'median': 0.283013249962781},
 {'median': 0.27135769603097776},
 {'median': 0.258649670822244},
 {'median': 0.27135769603097776},
 {'median': 0.27135769603097776},
 {'median': 0.2207834602829162},
 {'median': 0.19811875367430923},
 {'median': 0.07627783004076513},
 {'median': 0.27135769603097776},
 {'median': 0.10557571758495546},
 {'median': 0.18117936829904377},
 {'median': 0.15982514127305683},
 {'median': 0.31715078881440856},
 {'median': 0.26632956573468175},
 {'median': 0.26632956573468175},
 {'median': 0.3319074893061698},
 {'median': 0.19931205809287217},
 {'median': 0.1354450681635926},
 {'median': 0.3000227265348528},
 {'median': 0.3123873945064323},
 {'median': 0.25426262770085073},
 {'median': 0.3957923515486947},
 {'median': 0.18833425351563768},
 {'median': 0.1699183798175549},
 {'median': 0.05285700379635939},
 {'median': 0.044723718332335925},
 {'median': 0.046012361529963276},
 {'median': 0.22067197229529487},
 {'median': 0.3000227265348528},
 {'median': 0.12622313203684749},
 {'median': 0.12834531402922614},
 {'median': 0.3182551418201371},
 {'median': 0.23925896728419394},
 {'median': 0.16587899855485685},
 {'median': 0.2597193285899603},
 {'median': 0.07966991747936984},
 {'median': 0.07966991747936984},
 {'median': 0.16587899855485685},
 {'median': 0.26024333209069034},
 {'median': 0.07633702270613996},
 {'median': 0.5089903181189488},
 {'median': 0.12771196283391406},
 {'median': 0.06306775632468335},
 {'median': 0.06306775632468335},
 {'median': 0.06306775632468335},
 {'median': 0.06306775632468335},
 {'median': 0.04814278822961891},
 {'median': 0.04814278822961891},
 {'median': 0.04814278822961891},
 {'median': 0.03914124885456211},
 {'median': 0.03914124885456211},
 {'median': 0.03914124885456211},
 {'median': 0.04814278822961891},
 {'median': 0.04814278822961891},
 {'median': 0.04814278822961891},
 {'median': 0.06306775632468335},
 {'median': 0.06306775632468335},
 {'median': 0.06306775632468335},
 {'median': 0.07012076353720297},
 {'median': 0.07012076353720297},
 {'median': 0.06726870622926649},
 {'median': 0.0534227350693903},
 {'median': 0.0534227350693903},
 {'median': 0.0534227350693903},
 {'median': 0.0534227350693903},
 {'median': 0.09991809991809991},
 {'median': 0.09991809991809991},
 {'median': 0.1222810373204039},
 {'median': 0.13181106256697717},
 {'median': 0.13181106256697717},
 {'median': 0.13916544655929722},
 {'median': 0.13916544655929722},
 {'median': 0.13916544655929722},
 {'median': 0.13441192510452646},
 {'median': 0.09417196015134159},
 {'median': 0.06930148070677603},
 {'median': 0.13916544655929722},
 {'median': 0.17133055015913695},
 {'median': 0.19266975308641976},
 {'median': 0.19266975308641976},
 {'median': 0.25021526980482206},
 {'median': 0.25021526980482206},
 {'median': 0.25021526980482206},
 {'median': 0.2165395597643402},
 {'median': 0.18444263398391839},
 {'median': 0.2165395597643402},
 {'median': 0.2165395597643402},
 {'median': 0.2165395597643402},
 {'median': 0.21968645948945617},
 {'median': 0.21968645948945617},
 {'median': 0.21968645948945617},
 {'median': 0.21968645948945617},
 {'median': 0.17818130729514242},
 {'median': 0.2168317917595876},
 {'median': 0.17818130729514242},
 {'median': 0.17818130729514242},
 {'median': 0.17818130729514242},
 {'median': 0.21968645948945617},
 {'median': 0.21968645948945617},
 {'median': 0.21968645948945617},
 {'median': 0.21968645948945617},
 {'median': 0.2165395597643402},
 {'median': 0.2165395597643402},
 {'median': 0.17818130729514242},
 {'median': 0.2168317917595876},
 {'median': 0.2168317917595876},
 {'median': 0.2168317917595876},
 {'median': 0.23929739724079077},
 {'median': 0.23929739724079077},
 {'median': 0.23929739724079077},
 {'median': 0.23929739724079077},
 {'median': 0.24051382667604487},
 {'median': 0.24051382667604487},
 {'median': 0.22472393517854583},
 {'median': 0.21620644788202978},
 {'median': 0.20886443764286544},
 {'median': 0.24051382667604487},
 {'median': 0.24051382667604487},
 {'median': 0.24051382667604487},
 {'median': 0.24051382667604487},
 {'median': 0.23929739724079077},
 {'median': 0.23929739724079077},
 {'median': 0.23929739724079077},
 {'median': 0.23929739724079077},
 {'median': 0.2168317917595876},
 {'median': 0.2168317917595876},
 {'median': 0.2168317917595876},
 {'median': 0.21620644788202978},
 {'median': 0.21620644788202978},
 {'median': 0.21620644788202978},
 {'median': 0.14259086672879775},
 {'median': 0.14259086672879775},
 {'median': 0.14259086672879775},
 {'median': 0.2773001584572334},
 {'median': 0.2773001584572334},
 {'median': 0.25021526980482206},
 {'median': 0.12772466539196942},
 {'median': 0.12772466539196942},
 {'median': 0.12772466539196942},
 {'median': 0.12772466539196942},
 {'median': 0.20886443764286544},
 {'median': 0.20886443764286544},
 {'median': 0.3267767802069769},
 {'median': 0.29631833395314244},
 {'median': 0.29631833395314244},
 {'median': 0.07627783004076513},
 {'median': 0.09417196015134159},
 {'median': 0.09417196015134159},
 {'median': 0.2534503950834065},
 {'median': 0.2534503950834065},
 {'median': 0.18745427362661832},
 {'median': 0.18745427362661832},
 {'median': 0.2534503950834065},
 {'median': 0.07520525451559934},
 {'median': 0.07520525451559934},
 {'median': 0.09207152381277993},
 {'median': 0.26315086336461707},
 {'median': 0.24288796009168126},
 {'median': 0.24288796009168126},
 {'median': 0.24288796009168126},
 {'median': 0.26722063588822226},
 {'median': 0.27138902019042477},
 {'median': 0.27138902019042477},
 {'median': 0.27138902019042477},
 {'median': 0.19422997250574367},
 {'median': 0.19422997250574367},
 {'median': 0.19422997250574367},
 {'median': 0.23181036690200096},
 {'median': 0.23181036690200096},
 {'median': 0.23181036690200096},
 {'median': 0.19147587178584008},
 {'median': 0.19147587178584008},
 {'median': 0.19147587178584008},
 {'median': 0.26315086336461707},
 {'median': 0.4210314885201323},
 {'median': 0.26520953163516847},
 {'median': 0.26520953163516847},
 {'median': 0.47838249463836136},
 {'median': 0.47838249463836136},
 {'median': 0.47838249463836136},
 {'median': 0.47838249463836136},
 {'median': 0.5449594578240349},
 {'median': 0.5449594578240349},
 {'median': 0.12079481164619843},
 {'median': 0.12079481164619843},
 {'median': 0.20530822389251396},
 {'median': 0.15062174994347727},
 {'median': 0.15062174994347727},
 {'median': 0.21575262930891476},
 {'median': 0.14593993325917687},
 {'median': 0.14593993325917687},
 {'median': 0.14593993325917687},
 {'median': 0.14762473734085946},
 {'median': 0.14762473734085946},
 {'median': 0.2630667920978363},
 {'median': 0.24708178801483505},
 {'median': 0.24708178801483505},
 {'median': 0.14934041317514313},
 {'median': 0.14934041317514313},
 {'median': 0.24708178801483505},
 {'median': 0.0769998005186515},
 {'median': 0.0769998005186515},
 {'median': 0.09733389758781211},
 {'median': 0.1280121133463119},
 {'median': 0.1773993458892523},
 {'median': 0.1773993458892523},
 {'median': 0.12195473028896325},
 {'median': 0.12195473028896325},
 {'median': 0.14184882422845618},
 {'median': 0.14184882422845618},
 {'median': 0.14184882422845618},
 {'median': 0.13744356450299755},
 {'median': 0.13744356450299755},
 {'median': 0.12719839555692689},
 {'median': 0.12719839555692689},
 {'median': 0.13727848608772353},
 {'median': 0.1078614468444977},
 {'median': 0.1078614468444977},
 {'median': 0.1432878679109835},
 {'median': 0.13668545955159303},
 {'median': 0.1078614468444977},
 {'median': 0.18317757009345795},
 {'median': 0.1910196828868234},
 {'median': 0.09705482555505211},
 {'median': 0.17322914210650409},
 {'median': 0.15065605350198089},
 {'median': 0.15065605350198089},
 {'median': 0.17848589405317639},
 {'median': 0.17848589405317639},
 {'median': 0.12744254639301955},
 {'median': 0.12744254639301955},
 {'median': 0.2557554102886841},
 {'median': 0.11751438792969357},
 {'median': 0.11751438792969357},
 {'median': 0.13798095238095237},
 {'median': 0.13798095238095237},
 {'median': 0.16718931679644833},
 {'median': 0.16718931679644833},
 {'median': 0.16718931679644833},
 {'median': 0.14607348008789853},
 {'median': 0.29234270611555685},
 {'median': 0.29234270611555685},
 {'median': 0.29234270611555685},
 {'median': 0.09709781440343963},
 {'median': 0.09709781440343963},
 {'median': 0.09709781440343963},
 {'median': 0.06756704611229018},
 {'median': 0.10350993120068411},
 {'median': 0.10350993120068411},
 {'median': 0.134070796460177},
 {'median': 0.22711040753966794},
 {'median': 0.22711040753966794},
 {'median': 0.14878190255220416},
 {'median': 0.14878190255220416},
 {'median': 0.14878190255220416},
 {'median': 0.14878190255220416},
 {'median': 0.14878190255220416},
 {'median': 0.14878190255220416},
 {'median': 0.14878190255220416},
 {'median': 0.12911707722114585},
 {'median': 0.12911707722114585},
 {'median': 0.12911707722114585},
 {'median': 0.12911707722114585},
 {'median': 0.20593025961506498},
 {'median': 0.20593025961506498},
 {'median': 0.20593025961506498},
 {'median': 0.20593025961506498},
 {'median': 0.12892627152056774},
 {'median': 0.12892627152056774},
 {'median': 0.1447993447993448},
 {'median': 0.12892627152056774},
 {'median': 0.1447993447993448},
 {'median': 0.0949780314540303},
 {'median': 0.07950349595412051},
 {'median': 0.07950349595412051},
 {'median': 0.07950349595412051},
 {'median': 0.08131349323441386},
 {'median': 0.08131349323441386},
 {'median': 0.06551952349437459},
 {'median': 0.06551952349437459},
 {'median': 0.07705311860485808},
 {'median': 0.07705311860485808},
 {'median': 0.07705311860485808},
 {'median': 0.1795316565481353},
 {'median': 0.1795316565481353},
 {'median': 0.1795316565481353},
 {'median': 0.08721057950002196},
 {'median': 0.23785634655199872},
 {'median': 0.22098815843201305},
 {'median': 0.07122353785432364},
 {'median': 0.3065247013340939},
 {'median': 0.3065247013340939},
 {'median': 0.3065247013340939},
 {'median': 0.12936539794912966},
 {'median': 0.12936539794912966},
 {'median': 0.09468354430379747},
 {'median': 0.22065340616304235},
 {'median': 0.4469102803080927},
 {'median': 0.41517872620739865},
 {'median': 0.41517872620739865},
 {'median': 0.41340821340821343},
 {'median': 0.4469102803080927},
 {'median': 0.5809450252392906},
 {'median': 0.4859290551034354},
 {'median': 0.4859290551034354},
 {'median': 0.5546451920648727},
 {'median': 0.4616702627236959},
 {'median': 0.5759544190911343},
 {'median': 0.4501200752904524},
 {'median': 0.4501200752904524},
 {'median': 0.5206792497485356},
 {'median': 0.5206792497485356},
 {'median': 0.5206792497485356},
 {'median': 0.0934409687184662},
 {'median': 0.11669242658423493},
 {'median': 0.13057185980211303},
 {'median': 0.13057185980211303},
 {'median': 0.06524274228196159},
 {'median': 0.12244463373083475},
 {'median': 0.16024302259350673},
 {'median': 0.16024302259350673},
 {'median': 0.1908684863523573},
 {'median': 0.1908684863523573},
 {'median': 0.2588593660463854},
 {'median': 0.2588593660463854},
 {'median': 0.2588593660463854},
 {'median': 0.3474557898974883},
 {'median': 0.1714930924548353},
 {'median': 0.281255261119903},
 {'median': 0.281255261119903},
 {'median': 0.3970277479474833},
 {'median': 0.41242264800291206},
 {'median': 0.41242264800291206},
 {'median': 0.43810039236909754},
 {'median': 0.37103817439075926},
 {'median': 0.37103817439075926},
 {'median': 0.411120714491501},
 {'median': 0.40212354507972414},
 {'median': 0.40212354507972414},
 {'median': 0.40212354507972414},
 {'median': 0.40212354507972414},
 {'median': 0.3699273501137448},
 {'median': 0.3699273501137448},
 {'median': 0.4002927598243441},
 {'median': 0.4002927598243441},
 {'median': 0.4344875830710038},
 {'median': 0.32279483636118506},
 {'median': 0.32279483636118506},
 {'median': 0.32279483636118506},
 {'median': 0.35597967691505994},
 {'median': 0.35597967691505994},
 {'median': 0.19196902990739334},
 {'median': 0.19196902990739334},
 {'median': 0.19196902990739334},
 {'median': 0.19196902990739334},
 {'median': 0.19196902990739334},
 {'median': 0.19253234750462106},
 {'median': 0.193988684582744},
 {'median': 0.2725861095426313},
 {'median': 0.2725861095426313},
 {'median': 0.05609784781841703},
 {'median': 0.02018927444794953},
 {'median': 0.02018927444794953},
 {'median': 0.05126394577037142},
 {'median': 0.05126394577037142},
 {'median': 0.06300903302236044},
 {'median': 0.06300903302236044},
 {'median': 0.028098853798907},
 {'median': 0.028098853798907},
 {'median': 0.04758800521512386},
 {'median': 0.04758800521512386},
 {'median': 0.04758800521512386},
 {'median': 0.04758800521512386},
 {'median': 0.05432109804622882},
 {'median': 0.02155768344513288},
 {'median': 0.02155768344513288},
 {'median': 0.05059770675774579},
 {'median': 0.05059770675774579},
 {'median': 0.05059770675774579},
 {'median': 0.026124609093095982},
 {'median': 0.026124609093095982},
 {'median': 0.09788548348776431},
 {'median': 0.053128276826284515},
 {'median': 0.053128276826284515},
 {'median': 0.06461647853524131},
 {'median': 0.06461647853524131},
 {'median': 0.06461647853524131},
 {'median': 0.05951934691157482},
 {'median': 0.05951934691157482},
 {'median': 0.05951934691157482},
 {'median': 0.06010713723018749},
 {'median': 0.06010713723018749},
 {'median': 0.0807314014126345},
 {'median': 0.0807314014126345},
 {'median': 0.0807314014126345},
 {'median': 0.10735809390329362},
 {'median': 0.10735809390329362},
 {'median': 0.07520525451559934},
 {'median': 0.07520525451559934},
 {'median': 0.07520525451559934},
 {'median': 0.18444263398391839},
 {'median': 0.07684311530465376},
 {'median': 0.07684311530465376},
 {'median': 0.07684311530465376},
 {'median': 0.04286807859147742},
 {'median': 0.04286807859147742},
 {'median': 0.04286807859147742},
 {'median': 0.04286807859147742},
 {'median': 0.07684311530465376},
 {'median': 0.18444263398391839},
 {'median': 0.04286807859147742},
 {'median': 0.032482898076840336},
 {'median': 0.032482898076840336},
 {'median': 0.032482898076840336},
 {'median': 0.032482898076840336},
 {'median': 0.05714166631934314},
 {'median': 0.10827873734365694},
 {'median': 0.11069707157033497},
 {'median': 0.11069707157033497},
 {'median': 0.032482898076840336},
 {'median': 0.032482898076840336},
 {'median': 0.17422778093613794},
 {'median': 0.17422778093613794},
 {'median': 0.2871546909554331},
 {'median': 0.2871546909554331},
 {'median': 0.2871546909554331},
 {'median': 0.1186596422445479},
 {'median': 0.1186596422445479},
 {'median': 0.1186596422445479},
 {'median': 0.11743750570897908},
 {'median': 0.1306822125060726},
 {'median': 0.1306822125060726},
 {'median': 0.1306822125060726},
 {'median': 0.11533595980771316},
 {'median': 0.1781759317170082},
 {'median': 0.06705783738474434},
 {'median': 0.15176641820667755},
 {'median': 0.15176641820667755},
 {'median': 0.023114778545508773},
 {'median': 0.2773001584572334},
 {'median': 0.2773001584572334},
 {'median': 0.19174041297935104},
 {'median': 0.19174041297935104},
 {'median': 0.17697682681299592},
 {'median': 0.17697682681299592},
 {'median': 0.17697682681299592},
 {'median': 0.1803465386805499},
 {'median': 0.1803465386805499},
 {'median': 0.1803465386805499},
 {'median': 0.17938063504508037},
 {'median': 0.17938063504508037},
 {'median': 0.17938063504508037},
 {'median': 0.17938063504508037},
 {'median': 0.20579262405869858},
 {'median': 0.20579262405869858},
 {'median': 0.20579262405869858},
 {'median': 0.052591398761557384},
 {'median': 0.052591398761557384},
 {'median': 0.052591398761557384},
 {'median': 0.0823850034986926},
 {'median': 0.0823850034986926},
 {'median': 0.0823850034986926},
 {'median': 0.0823850034986926},
 {'median': 0.20915856683883038},
 {'median': 0.20915856683883038},
 {'median': 0.20915856683883038},
 {'median': 0.20915856683883038},
 {'median': 0.17109777015437394},
 {'median': 0.11717996970670583},
 {'median': 0.11717996970670583},
 {'median': 0.11717996970670583},
 {'median': 0.11717996970670583},
 {'median': 0.0344435250310302},
 {'median': 0.04819333426821858},
 {'median': 0.04819333426821858},
 {'median': 0.04819333426821858},
 {'median': 0.05514705882352941},
 {'median': 0.05514705882352941},
 {'median': 0.04799861375844741},
 {'median': 0.04799861375844741},
 {'median': 0.08063699723552545},
 {'median': 0.08063699723552545},
 {'median': 0.08063699723552545},
 {'median': 0.13613572101790763},
 {'median': 0.13613572101790763},
 {'median': 0.12335401846526411},
 {'median': 0.12335401846526411},
 {'median': 0.09140625},
 {'median': 0.09140625},
 {'median': 0.05514705882352941},
 {'median': 0.05514705882352941},
 {'median': 0.05514705882352941},
 {'median': 0.04819333426821858},
 {'median': 0.04819333426821858},
 {'median': 0.04819333426821858},
 {'median': 0.04819333426821858},
 {'median': 0.0344435250310302},
 {'median': 0.20139420867167152},
 {'median': 0.20139420867167152},
 {'median': 0.20139420867167152},
 {'median': 0.20139420867167152},
 {'median': 0.1610583499433306},
 {'median': 0.1610583499433306},
 {'median': 0.1610583499433306},
 {'median': 0.08423236514522822},
 {'median': 0.08423236514522822},
 {'median': 0.08423236514522822},
 {'median': 0.27400273961230337},
 {'median': 0.27400273961230337},
 {'median': 0.27400273961230337},
 {'median': 0.27400273961230337},
 {'median': 0.3559478837406522},
 {'median': 0.07235265931959751},
 {'median': 0.3559478837406522},
 {'median': 0.07235265931959751},
 {'median': 0.07235265931959751},
 {'median': 0.1179638637943016},
 {'median': 0.1179638637943016},
 {'median': 0.0808193349331505},
 {'median': 0.07283448218586497},
 {'median': 0.07283448218586497},
 {'median': 0.07283448218586497},
 {'median': 0.0815946348733234},
 {'median': 0.0815946348733234},
 {'median': 0.0815946348733234},
 {'median': 0.0815946348733234},
 {'median': 0.3032574228884405},
 {'median': 0.26215073147056783},
 {'median': 0.12337094558021401},
 {'median': 0.12337094558021401},
 {'median': 0.12337094558021401},
 {'median': 0.13273336292828605},
 {'median': 0.13273336292828605},
 {'median': 0.13273336292828605},
 {'median': 0.18279724813600837},
 {'median': 0.18279724813600837},
 {'median': 0.13273336292828605},
 {'median': 0.18279724813600837},
 {'median': 0.18279724813600837},
 {'median': 0.18279724813600837},
 {'median': 0.18279724813600837},
 {'median': 0.22039150254744808},
 {'median': 0.18279724813600837},
 {'median': 0.18279724813600837},
 {'median': 0.18356492752537548},
 {'median': 0.18356492752537548},
 {'median': 0.18356492752537548},
 {'median': 0.294832179009057},
 {'median': 0.294832179009057},
 {'median': 0.294832179009057},
 {'median': 0.294832179009057},
 {'median': 0.22420252809972338},
 {'median': 0.22420252809972338},
 {'median': 0.1566663151604626},
 {'median': 0.1566663151604626},
 {'median': 0.13742950430394776},
 {'median': 0.1566663151604626},
 {'median': 0.1566663151604626},
 {'median': 0.22420252809972338},
 {'median': 0.23268996696226743},
 {'median': 0.24323397248996673},
 {'median': 0.24323397248996673},
 {'median': 0.18356492752537548},
 {'median': 0.18356492752537548},
 {'median': 0.18356492752537548},
 {'median': 0.13513955963002375},
 {'median': 0.15658689502255524},
 {'median': 0.19813341493268055},
 {'median': 0.25359740058796226},
 {'median': 0.25359740058796226},
 {'median': 0.28420975106790397},
 {'median': 0.28420975106790397},
 {'median': 0.19813341493268055},
 {'median': 0.25359740058796226},
 {'median': 0.25042466096739163},
 {'median': 0.25042466096739163},
 {'median': 0.26642007397780665},
 {'median': 0.18271761217895333},
 {'median': 0.18999159200950974},
 {'median': 0.18999159200950974},
 {'median': 0.18999159200950974},
 {'median': 0.1740467572054541},
 {'median': 0.19102887963405477},
 {'median': 0.11671279820746013},
 {'median': 0.11671279820746013},
 {'median': 0.13127036925041158},
 {'median': 0.13127036925041158},
 {'median': 0.09989463979981562},
 {'median': 0.16982961629034493},
 {'median': 0.16982961629034493},
 {'median': 0.16982961629034493},
 {'median': 0.13848551391938796},
 {'median': 0.13848551391938796},
 {'median': 0.13848551391938796},
 {'median': 0.13848551391938796},
 {'median': 0.09956003406187908},
 {'median': 0.07514829940084061},
 {'median': 0.07514829940084061},
 {'median': 0.072151452595539},
 {'median': 0.05490503527983612},
 {'median': 0.05490503527983612},
 {'median': 0.17089130734260918},
 {'median': 0.10552392220661096},
 {'median': 0.10552392220661096},
 {'median': 0.10552392220661096},
 {'median': 0.17893728547481574},
 {'median': 0.17893728547481574},
 {'median': 0.1999050171308389},
 {'median': 0.1999050171308389},
 {'median': 0.1999050171308389},
 {'median': 0.11970287836583102},
 {'median': 0.11970287836583102},
 {'median': 0.10552392220661096},
 {'median': 0.06525267828157126},
 {'median': 0.06525267828157126},
 {'median': 0.05490503527983612},
 {'median': 0.05490503527983612},
 {'median': 0.05514123240421367},
 {'median': 0.05514123240421367},
 {'median': 0.05514123240421367},
 {'median': 0.07514829940084061},
 {'median': 0.07514829940084061},
 {'median': 0.08361865094772511},
 {'median': 0.08361865094772511},
 {'median': 0.07790011389914749},
 {'median': 0.07790011389914749},
 {'median': 0.07790011389914749},
 {'median': 0.07790011389914749},
 {'median': 0.11414977067169617},
 {'median': 0.11414977067169617},
 {'median': 0.47987866531850354},
 {'median': 0.47987866531850354},
 {'median': 0.36584887144259076},
 {'median': 0.33410534674430914},
 {'median': 0.2391929035482259},
 {'median': 0.2391929035482259},
 {'median': 0.2391929035482259},
 {'median': 0.2391929035482259},
 {'median': 0.13260992997287238},
 {'median': 0.2833047976394303},
 {'median': 0.2833047976394303},
 {'median': 0.3620232358324928},
 {'median': 0.3620232358324928},
 {'median': 0.1436993947016744},
 {'median': 0.2562852499761017},
 {'median': 0.18737174427782163},
 {'median': 0.18737174427782163},
 {'median': 0.2645397355244576},
 {'median': 0.2645397355244576},
 {'median': 0.33614241384942023},
 {'median': 0.33614241384942023},
 {'median': 0.10419605788222017},
 {'median': 0.10419605788222017},
 {'median': 0.10257259578226786},
 {'median': 0.10257259578226786},
 {'median': 0.10257259578226786},
 {'median': 0.10257259578226786},
 {'median': 0.10257259578226786},
 {'median': 0.11899953394438403},
 {'median': 0.07289508381992843},
 {'median': 0.07289508381992843},
 {'median': 0.03777257282354105},
 {'median': 0.11229828310367695},
 {'median': 0.11229828310367695},
 {'median': 0.07257276077310672},
 {'median': 0.08138316451274887},
 {'median': 0.08138316451274887},
 {'median': 0.08138316451274887},
 {'median': 0.10532515536780536},
 {'median': 0.23565837865023734},
 {'median': 0.23565837865023734},
 {'median': 0.3191741234636677},
 {'median': 0.3191741234636677},
 {'median': 0.3191741234636677},
 {'median': 0.3191741234636677},
 {'median': 0.3191741234636677},
 {'median': 0.41425245732022764},
 {'median': 0.41425245732022764},
 {'median': 0.41425245732022764},
 {'median': 0.24571889553005025},
 {'median': 0.24571889553005025},
 {'median': 0.24571889553005025},
 {'median': 0.282040397608688},
 {'median': 0.282040397608688},
 {'median': 0.282040397608688},
 {'median': 0.2676646079765519},
 {'median': 0.2676646079765519},
 {'median': 0.31064958020327},
 {'median': 0.17244532500190504},
 {'median': 0.22033898305084745},
 {'median': 0.06462299571535846},
 {'median': 0.17761083647970105},
 {'median': 0.3979834157355861},
 {'median': 0.36918359524722116},
 {'median': 0.19667779126213591},
 {'median': 0.11764917973679466},
 {'median': 0.1782441413081497},
 {'median': 0.0608885595038421},
 {'median': 0.056378280072746166},
 {'median': 0.056378280072746166},
 {'median': 0.056378280072746166},
 {'median': 0.056378280072746166},
 {'median': 0.056378280072746166},
 {'median': 0.05292664386164956},
 {'median': 0.05292664386164956},
 {'median': 0.05292664386164956},
 {'median': 0.05292664386164956},
 {'median': 0.061276003133431976},
 {'median': 0.061276003133431976},
 {'median': 0.061276003133431976},
 {'median': 0.06221536086453107},
 {'median': 0.07449191870699312},
 {'median': 0.061276003133431976},
 {'median': 0.061276003133431976},
 {'median': 0.05292664386164956},
 {'median': 0.05292664386164956},
 {'median': 0.05292664386164956},
 {'median': 0.05292664386164956},
 {'median': 0.056378280072746166},
 {'median': 0.056378280072746166},
 {'median': 0.056378280072746166},
 {'median': 0.056378280072746166},
 {'median': 0.10405326023105542},
 {'median': 0.10405326023105542},
 {'median': 0.12059539346054812},
 {'median': 0.12059539346054812},
 {'median': 0.12059539346054812},
 {'median': 0.16789056875449965},
 {'median': 0.13930789707187222},
 {'median': 0.13930789707187222},
 {'median': 0.09803065050416804},
 {'median': 0.18111292825093303},
 {'median': 0.18111292825093303},
 {'median': 0.3197317734341561},
 {'median': 0.37092637554286495},
 {'median': 0.37092637554286495},
 {'median': 0.37092637554286495},
 {'median': 0.4073088770652478},
 {'median': 0.4073088770652478},
 {'median': 0.4073088770652478},
 {'median': 0.4073088770652478},
 {'median': 0.4073088770652478},
 {'median': 0.4073088770652478},
 {'median': 0.1338496440585152},
 {'median': 0.1338496440585152},
 {'median': 0.09410911312182645},
 {'median': 0.20483132669154133},
 {'median': 0.20483132669154133},
 {'median': 0.06735975741823695},
 {'median': 0.5075314180456936},
 {'median': 0.49181325899580247},
 {'median': 0.45867668861841876},
 {'median': 0.37443223189209807},
 {'median': 0.37443223189209807},
 {'median': 0.12313564003414855},
 {'median': 0.12313564003414855},
 {'median': 0.09743389979062181},
 {'median': 0.09743389979062181},
 {'median': 0.09743389979062181},
 {'median': 0.049380612816082164},
 {'median': 0.049380612816082164},
 {'median': 0.2014774787099422},
 {'median': 0.2014774787099422},
 {'median': 0.2014774787099422},
 {'median': 0.2014774787099422},
 {'median': 0.13272290870299583},
 {'median': 0.10222595548089038},
 {'median': 0.12281118770303462},
 {'median': 0.12281118770303462},
 {'median': 0.3403765935051265},
 {'median': 0.3403765935051265},
 {'median': 0.2538942292439961},
 {'median': 0.2538942292439961},
 {'median': 0.2932330827067669},
 {'median': 0.3423456790123457},
 {'median': 0.221494186419991},
 {'median': 0.221494186419991},
 {'median': 0.3600175664230371},
 {'median': 0.3600175664230371},
 {'median': 0.25272769225697994},
 {'median': 0.25272769225697994},
 {'median': 0.27986651045549754},
 {'median': 0.27986651045549754},
 {'median': 0.27986651045549754},
 {'median': 0.27986651045549754},
 {'median': 0.2606644721213561},
 {'median': 0.223830940792311},
 {'median': 0.3664114412925423},
 {'median': 0.3664114412925423},
 {'median': 0.3721635400353204},
 {'median': 0.2764583482815527},
 {'median': 0.2764583482815527},
 {'median': 0.2764583482815527},
 {'median': 0.2764583482815527},
 {'median': 0.2764583482815527},
 {'median': 0.2916666666666667},
 {'median': 0.36853518377968125},
 {'median': 0.3946527777777778},
 {'median': 0.39744274673220076},
 {'median': 0.2968323320589842},
 {'median': 0.262929829466033},
 {'median': 0.262929829466033},
 {'median': 0.32441772064413577},
 {'median': 0.36282801995228803},
 {'median': 0.36282801995228803},
 {'median': 0.19022461814914646},
 {'median': 0.23674307218611015},
 {'median': 0.1967375185368265},
 {'median': 0.3018502202643172},
 {'median': 0.25663974386960636},
 {'median': 0.3099150536137028},
 {'median': 0.37592573632299237},
 {'median': 0.31155120066243447},
 {'median': 0.2358796874442502},
 {'median': 0.17242719956455815},
 {'median': 0.17128102615358987},
 {'median': 0.1775949755947708},
 {'median': 0.17490058637190806},
 {'median': 0.1971863242270571},
 {'median': 0.23753421809487507},
 {'median': 0.28258908434821833},
 {'median': 0.3095575772250856},
 {'median': 0.36154831925869946},
 {'median': 0.36154831925869946},
 {'median': 0.229353887685149},
 {'median': 0.3218603422078351},
 {'median': 0.3218603422078351},
 {'median': 0.23140673439945977},
 {'median': 0.15811655784709988},
 {'median': 0.25584308812590534},
 {'median': 0.2910758965804837},
 {'median': 0.31163434903047094},
 {'median': 0.29788921194728696},
 {'median': 0.20306460519050248},
 {'median': 0.28897378017016845},
 {'median': 0.29146323420624354},
 {'median': 0.4451252723311547},
 {'median': 0.4940551311856526},
 {'median': 0.24829522663457682},
 {'median': 0.3616464257144935},
 {'median': 0.3494904389787173},
 {'median': 0.26988555078683835},
 {'median': 0.26988555078683835},
 {'median': 0.2652435764940665},
 {'median': 0.3449194012665515},
 {'median': 0.2571953058414738},
 {'median': 0.34463940315004143},
 {'median': 0.33351397383293335},
 {'median': 0.2966505512851727},
 {'median': 0.2757317575924145},
 {'median': 0.3434484551155008},
 {'median': 0.2580036439354503},
 {'median': 0.3210615233000141},
 {'median': 0.3210615233000141},
 {'median': 0.2951722648234151},
 {'median': 0.30856921287320666},
 {'median': 0.2993675582093771},
 {'median': 0.3186845816940094},
 {'median': 0.458581758213878},
 {'median': 0.479506810564831},
 {'median': 0.4276672995569768},
 ...]
In [238]:
# Store the median value in the street tree data frame
StreetTree['NDVI_StreetTree'] = [s['median'] for s in NDVI_StreetTree]

2.2.3 Plotting the results

Histogram

In [239]:
# Initialize
fig, ax = plt.subplots(figsize=(8,6))

# Plot a quick histogram 
ax.hist(StreetTree['NDVI_StreetTree'], bins='auto')
ax.axvline(x=0, c='k', lw=2)

# Format
ax.set_xlabel("NDVI", fontsize=18)
ax.set_ylabel("Number of Street Trees", fontsize=18);

Choropleth

In [240]:
# Initialize
fig, ax = plt.subplots(figsize=(10,10), facecolor='#888888')

# Plot the city limits
CityLimits.plot(ax=ax, edgecolor='black', facecolor='none', linewidth=4)

# Plot the median NDVI
StreetTree.plot(column='NDVI_StreetTree', legend=True, ax=ax)

# Format
ax.set_axis_off()